package Acwing.数据结构;

import java.util.Scanner;
import java.util.Stack;

/**
 * @Title: expression
 * @Author 贾金博
 * @Package Acwing.数据结构
 * @Date 2025/4/10 上午11:20
 * @description: 表示式求值
 */
public class expression {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        // 表示式的求值就需要两个桟了
        Stack<Integer> stackNum = new Stack<>(); // 存放数字的桟
        Stack<Character> stackOp = new Stack<>();// 存放操作符的桟
        int num = 0;
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c >= '0' && c <= '9') { // 表示的是 当前的字符是一个数字
//                stackNum.push(c - '0'); // 注意转换为 真正的数字
                num = num * 10 + c - '0';
            } else {
                if(num != 0 ) {
                    stackNum.push(num);// 不是的时候再去放进去
                }
                num = 0; // 这个清空的操作不要忘了
                // 这里要对优先级进行判断了
                if(c == '+' || c == '-') {
                    if(stackOp.isEmpty()) {
                        stackOp.push(c);
                    } else {
                        while(!stackOp.isEmpty() && stackOp.peek() != '(') {
                            char t = stackOp.pop();
                            // 取得数字桟里面的前两个数值 注意运算的顺序
                            int x = stackNum.pop();
                            int y = stackNum.pop();
                            stackNum.push(js(y, x, t));
                        }
                        // 最后的时候在去进行放进去
                        stackOp.push(c);
                    }
                } else if(c == '*' || c == '/') {
                    if(stackOp.isEmpty()) {
                        stackOp.push(c);
                    } else {
                        while(!stackOp.isEmpty() && (stackOp.peek() == '*' || stackOp.peek() == '/')) {
                            char t = stackOp.pop();
                            // 取得数字桟里面的前两个数值 注意运算的顺序
                            int x = stackNum.pop();
                            int y = stackNum.pop();
                            stackNum.push(js(y, x, t));
                        }
                        // 最后的时候在去进行放进去
                        stackOp.push(c);
                    }
                } else if(c == '(') {
                    // 直接放进去
                    stackOp.push(c);
                } else if(c == ')') {
                    while(!stackOp.isEmpty() && stackOp.peek() != '(') {
                        char t = stackOp.pop();
                        // 取得数字桟里面的前两个数值 注意运算的顺序
                        int x = stackNum.pop();
                        int y = stackNum.pop();
                        stackNum.push(js(y, x, t));
                    }
                    // 要去删除这个 (
                    stackOp.pop();
                    // 最后的时候在去进行放进去
                   // stackOp.push(c);
                }
            }
        }
        if(num != 0) {
            stackNum.push(num);
        }

        // 最后的时候也要去计算的
        while(!stackOp.isEmpty()) {
            char t = stackOp.pop();
            int x = stackNum.pop();
            int y = stackNum.pop();
            stackNum.push(js(y, x, t));
        }
        // 最后的答案 也即是数字桟里面的 第一个数(Only one )
        System.out.println(stackNum.peek());
    }

    public static int js(int x, int y, char op) {
        if(op == '+') {
            return x + y;
        } else if(op == '-') {
            return x - y;
        } else if(op == '*') {
            return x * y;
        } else if(op == '/') {
            return x / y;
        }
        return 0;
    }
}
